package org.zjt.design.pattern;

import lombok.Data;
import static java.lang.System.out;

/**
 * @author <a href="juntao.zhang@qq.com">juntao.zhang</a>
 * @Description: 装饰器模式,包装 + 定制 一个类的方法。
 * @Package org.zjt.design.pattern
 * @date 2018/5/8 17:04

使用场景：
    ● 需要扩展一个类的功能，或给一个类增加附加功能。
    ● 需要动态地给一个对象增加功能，这些功能可以再动态地撤销。
    ● 需要为一批的兄弟类进行改装或加装功能，当然是首选装饰模式。


 */
public class DecoratorTest {

    public static void main(String[] args) {
        PersonDecorator personDecorator = new PersonDecorator(new Person());
        personDecorator.eat();
    }
}


interface Action{

    void eat();
}

@Data
class Person implements Action{
    private String name;
    private Integer age;

    @Override
    public void eat() {
        out.println("----------eat-----------");
    }
}


class PersonDecorator implements Action{

    private final Person person;

    public PersonDecorator(Person person) {
        this.person = person;
    }

    @Override
    public void eat() {
        /* todo 实现一个装饰和包装 */
        person.eat();
    }

}